package com.jie.common.http.entity;

import cn.hutool.core.util.SerializeUtil;
import com.jie.common.http.constant.HttpEntityClassNameConstant;

import java.nio.charset.StandardCharsets;

/**
 * 实体体
 * @author XieZhiJie
 * @date 2022/04/21 16:58
 */
public class HttpEntityBody {

    /**
     * 具体数据, 该数据类型必须实现了Serializable接口
     */
    private Object data;

    public HttpEntityBody() {}

    /**
     * 实体体的构造方法
     * @param object 该对象必须要实现Serializable接口
     */
    public HttpEntityBody(Object object) {
        this.data = object;
    }

    /**
     * 序列化实体的对象为byte数组
     * 如果对象是字符串, 那么直接将其转为byte数组而不序列化
     * @return 返回序列化后的数据
     */
    public byte[] getDataBytes() {
        return this.data == null ? new byte[] {} : this.data instanceof String ? ((String) this.data).getBytes(StandardCharsets.UTF_8) : SerializeUtil.serialize(this.data);
    }

    /**
     * 解码字节数组
     * @param bytes               字节数组
     * @param entityDataClassName 实体类名
     */
    public void deserializeAndSetData(byte[] bytes, String entityDataClassName) {
        // 这里我将String直接转为byte数组, 其它可序列化对象直接序列化, 因此解序列化的时候需要判断
        boolean resolveToString = HttpEntityClassNameConstant.STRING_CLASS_NAME.equals(entityDataClassName)
                || HttpEntityClassNameConstant.JSON_STRING_CLASS_NAME.equals(entityDataClassName)
                || HttpEntityClassNameConstant.JSON_LIST_STRING_CLASS_NAME.equals(entityDataClassName);
        if (resolveToString) {
            this.setData(new String(bytes));
        } else if (entityDataClassName != null) {
            // 非json的对象的序列化字节数组的反序列化
            this.setData(SerializeUtil.deserialize(bytes));
        }
    }

    /**
     * 直接返回实体数据
     * @return 实体数据
     */
    public Object getData() {
        return this.data == null ? "" : this.data;
    }

    public void setData(Object data) {
        this.data = data;
    }

    @Override
    public String toString() {
        return this.data == null ? "" : this.data.toString();
    }

}
